package com.example.demo.dao;

import com.example.demo.entity.GoodsItem;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface GoodJPARepository extends JpaRepository<GoodsItem, Long>,JpaSpecificationExecutor<GoodsItem>{
    /**
     *  利用方法名表示查询条件的示例。
     *  根据Name查询
     */
    List<GoodsItem> findByName(String name);

    /**
     *  利用方法名表示查询条件的示例。
     *  根据Name进行模糊查询
     */
    List<GoodsItem> findByNameContaining(String name);

    /**
     *  利用方法名表示查询条件的示例。
     *  根据价格范围查询
     */
    List<GoodsItem> findByPriceBetween(double price1,double price2);


    /**
     * 使用JPQL查询。
     * 注意：按照实体类名称、字段写查询条件
     */
    @Query("select u from User u where name= ?1")
    List<GoodsItem> findWithJPQLByName(String name);


    /**
     * 根据多个条件组合动态查询。参数为null时不做查询条件
     * @param name
     * @param price
     * @return
     */
    @Query("select u from User u where (?1 = null or name like %?1%) and  (?2 = null or price <= ?2)")
    List<GoodsItem> findWithJPQLByNameAndPrice(String name,double price);


    /**
     * 使用SQL查询
     * 注意：按照实际的数据库表名、字段写查询条件
     */
    @Query(value = "select * from user where name like ?1",nativeQuery = true)
    List<GoodsItem> findWithSQLByName(String name);


    /**
     * 根据name模糊查询，并分页
     * @param name 用户名
     * @param pageable
     * @return
     */
    Page<GoodsItem> findByNameContaining(String name, Pageable pageable);
}
